package com.cskaoyan.javase.oop2._1extends._5protected._3clone;

import com.cskaoyan.javase.oop2._1extends._5protected._2example.test.TestSon;

import javax.swing.*;

/**
 * clone方法是java.lang.Object类当中的一个受保护protected成员
 * 那么它的访问特点是什么样的呢?
 * 首先必然不是同包,而是不同包,那么就必须在子类中创建子类自身对象,才能够调用clone方法
 * 而Java中,所有类都是Object类的子类
 *
 * 扩展:
 *      1.在方法重写当中,除了可以修改方法的实现,还可以修改方法的访问权限修饰符
 *          也就是说,子类可以重写父类方法的访问权限
 *          可以从 protected --> public
 *
 *      (补充)2.
 *      导包是使用不同包下类的一种语法形式
 *      java.lang包下的类是Java的核心类
 *      所有的Java程序必然都会依赖该包下的类
 *      所以该包下的类存在隐式的导入
 *      实际上导入了,导包了,只是没有明确写出来
 *
 *
 * @since 11:23
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class Demo {
    public static void main(String[] args) throws CloneNotSupportedException {
        System.out.println();
        Student s = new Student();
        // s引用能不能调用clone方法?
        // 'clone()' has protected access in 'java.lang.Object'
        /*
            之所以不能访问,是因为没有访问权限
            Demo类和Student类都是Object类的子类
            所以在子类中只能创建自身对象,才能够调用继承自父类的clone方法
            也就是说,在默认情况下
            这里只能创建Demo自身对象,才能够调用clone方法
         */
        // s.clone();

        Demo d = new Demo();
        // Unhandled exception: java.lang.CloneNotSupportedException
        d.clone();

        // 创建Teacher对象
        Teacher t = new Teacher();
        t.clone();

        // 创建Car对象
        Car c = new Car();
        c.clone();
    }
}

class Student {
    public void test() throws CloneNotSupportedException {
        clone();
    }
}

class Teacher {
    @Override
    public Object clone() throws CloneNotSupportedException {
        return super.clone();
    }
}

class Car {
    /*
        这里看起来 protected访问权限和父类保持了一致
        看起来没有修改访问权限
        但实际上改变了访问权限
        因为所属包变了
        从java.lang包变成了现在这个包
        所以同包下可以任意访问了
     */
    @Override
    protected Object clone() throws CloneNotSupportedException {
        return super.clone();
    }
}